#include "TorrentGui.h"
#include "Gui.h"

TorrentGui::TorrentGui(const TreeModel::Row& torrent, Gui* gui) {

	this->gui = gui;
	this->torrent = torrent;
	this->modeloPeers = ListStore::create(this->columnasPeer);

	// creo la ventana de propiedades y la escondo
	this->vistaPropiedades = new VentanaPropiedades(this->modeloPeers);
	this->vistaPropiedades->set_title("Propiedades de " + (*torrent)[this->columnasTorrent.nombre]);
	this->vistaPropiedades->signal_hide().connect(sigc::mem_fun(*this,&TorrentGui::ventanaCerrada));

	this->setNombre("");
	this->setTamanio(0);
	this->setBajado(0);
	this->setSubido(0);
	this->setCantPeers(0);
	this->setVelocidad(0);
	this->setError("Ninguno");
	this->setEstado("Sin Empezar");

	this->setAnuncio("Anuncio");
	this->setProximoAnuncio("Proximo anuncio");
	this->setUltimoAnuncio("Ultimo anuncio");

}

TorrentGui::~TorrentGui() {
	delete vistaPropiedades;
	map<string, PeerGui*>::const_iterator it;
	for(it = this->peers.begin(); it != this->peers.end(); it++) {
		delete it->second;
	}
}

void TorrentGui::mostrarVentana() {

	this->vistaPropiedades->show_all();

}

string TorrentGui::getNombre() {
	Glib::ustring retorno = this->torrent[this->columnasTorrent.nombre];

	return retorno;
}

void TorrentGui::setNombre(const string& nombre) {

	this->torrent[this->columnasTorrent.nombre] = nombre;
	this->vistaPropiedades->set_title("Propiedades de " + (*torrent)[this->columnasTorrent.nombre]);
}

string TorrentGui::getId() {
	Glib::ustring retorno = this->torrent[this->columnasTorrent.id];

	return retorno;
}

void TorrentGui::setBajado(double bajado) {
	this->torrent[columnasTorrent.bajado] = bajado;

	char aux[10];
	sprintf(aux,"%.1f",bajado);
	string mensaje = "<b>Bajado: </b>";
	mensaje += aux;
	mensaje += " MB";
	this->vistaPropiedades->labelBajado.set_markup(mensaje);

	mensaje = "<b>Progreso: </b>";
	double tamanio = this->getTamanio();
	if (tamanio != 0) {
		char aux2[10];
		sprintf(aux2,"%.1f",100*bajado/tamanio);
		mensaje += aux2;
		this->torrent[columnasTorrent.porcentaje] = 100*bajado/tamanio;
	} else {
		mensaje += "0";
		this->torrent[columnasTorrent.porcentaje] = 0;
	}
	mensaje += " %";
	this->vistaPropiedades->labelProgreso.set_markup(mensaje);

	mensaje = "<b>Radio: </b>";
	double subido = this->getSubido();
	if (subido != 0 && bajado != 0) {
		char aux3[10];
		sprintf(aux3,"%.2f",subido/bajado);
		mensaje += aux3;
	} else {
		mensaje += "1";
	}
	this->vistaPropiedades->labelRatio.set_markup(mensaje);
}

int TorrentGui::getBajado() {
	int retorno = this->torrent[this->columnasTorrent.bajado];

	return retorno;
}

void TorrentGui::setSubido(double subido) {
	this->torrent[this->columnasTorrent.subido] = subido;

	string mensaje = "<b>Subido: </b>";
	char aux[10];
	sprintf(aux,"%.1f",subido);
	mensaje += aux;
	mensaje += " MB";
	this->vistaPropiedades->labelSubido.set_markup(mensaje);
}

void TorrentGui::setMaxPeersConectados(int maxPeersConectados) {
	this->vistaPropiedades->spinButtonMaxPeersConectados.set_value(maxPeersConectados);
	this->cantMaxPeers = maxPeersConectados;
}

double TorrentGui::getSubido() {
	return this->torrent[this->columnasTorrent.subido];
}

void TorrentGui::setError(const string& error) {
	this->torrent[this->columnasTorrent.error] = error;
	this->vistaPropiedades->labelError.set_markup("<b>Error: </b>" + error);
}

void TorrentGui::setEstado(const string& estado) {
	this->torrent[this->columnasTorrent.estado] = estado;
	this->vistaPropiedades->labelEstado.set_markup("<b>Estado: </b>" + estado);
}

void TorrentGui::setVelocidad(double velocidad) {
	this->torrent[this->columnasTorrent.velocidad] = velocidad;
}

double TorrentGui::getTamanio() {
	return this->torrent[this->columnasTorrent.tamanio];
}

void TorrentGui::setTamanio(double tamanio) {
	this->torrent[this->columnasTorrent.tamanio] = tamanio;
}

int TorrentGui::getCantPeers() {
	return this->torrent[this->columnasTorrent.peers];
}

void TorrentGui::setCantPeers(int peers) {
	this->torrent[this->columnasTorrent.peers] = peers;
}

void TorrentGui::setAnuncio(const string& anuncio) {
	this->vistaPropiedades->labelTrackerAnuncio.set_markup("<b>Anuncio:</b> " + anuncio);
}

void TorrentGui::setUltimoAnuncio(const string& ultimo) {
	this->vistaPropiedades->labelTrackerUltimoAnuncio.set_markup("<b>Ultimo Anuncio:</b> " + ultimo);
}

void TorrentGui::setProximoAnuncio(const string& proximo) {
	this->vistaPropiedades->labelTrackerProximoAnuncio.set_markup("<b>Proximo Anuncio:</b> " + proximo);
}

PeerGui* TorrentGui::getPeer(const string& id) {
	return this->peers[id];
}

PeerGui* TorrentGui::addPeer(const string& id) {
	TreeModel::Row fila = *(modeloPeers->append());
	fila[this->columnasPeer.id] = id;

	this->peers[id] = new PeerGui(fila);
	return this->peers[id];
}

void TorrentGui::removePeer(const string& id) {
	delete this->peers[id];
	this->peers.erase(id);

	TreeModel::Children filas = modeloPeers->children();
	for(TreeModel::Children::iterator iter = filas.begin();
	iter != filas.end(); ++iter)
	{
		TreeModel::Row fila = *iter;
		if (fila[columnasPeer.id] == id) {
			modeloPeers->erase(iter);
		}
	}
}

void TorrentGui::ventanaCerrada() {
	int cantPeersNuevo = this->vistaPropiedades->spinButtonMaxPeersConectados.get_value();
	if (cantPeersNuevo != this->cantMaxPeers) {
		this->cantMaxPeers = cantPeersNuevo;
		Glib::ustring id = this->torrent[this->columnasTorrent.id];
		this->gui->cantMaxPeers(id, cantPeersNuevo);
	}
}
